﻿/**
 * @file NandDevice.h
 * @brief NAND设备仿真模块，管理多个块的读写和擦除操作。
 */
#ifndef __NandDevice_h__
#define __NandDevice_h__

#include <memory>
#include <vector>
#include "Nand/Sim/NandDeviceDesc.h"
#include "Nand/Sim/NandBlock.h"
#include "Buffer/Types.h"
#include "Buffer/Hal/BufferHal.h"

/**
 * @class NandDevice
 * @brief NAND设备仿真类，管理块集合和读写操作。
 */
class NandDevice
{
public:
    /**
     * @brief 构造函数，初始化设备参数和块集合。
     * @param bufferHal 缓冲区管理器
     * @param blockCount 块数
     * @param pagesPerBlock 每块页数
     * @param bytesPerPage 每页字节数
     */
    NandDevice(BufferHal *bufferHal, U32 blockCount, U32 pagesPerBlock, U32 bytesPerPage);
    NandDevice(NandDevice &&rhs) = default;

    /**
     * @brief 读整页数据。
     * @param block 块号
     * @param page 页号
     * @param outBuffer 输出缓冲区
     * @return 是否成功
     */
    bool ReadPage(tBlockInDevice block, tPageInBlock page, const Buffer &outBuffer);

    /**
     * @brief 读部分页数据。
     * @param block 块号
     * @param page 页号
     * @param sector 起始扇区
     * @param sectorCount 扇区数
     * @param outBuffer 输出缓冲区
     * @param bufferOffset 输出缓冲区偏移
     * @return 是否成功
     */
    bool ReadPage(const tBlockInDevice &block, const tPageInBlock &page, const tSectorInPage &sector, const tSectorCount &sectorCount,
                  const Buffer &outBuffer, const tSectorOffset &bufferOffset);

    /**
     * @brief 写整页数据。
     * @param block 块号
     * @param page 页号
     * @param inBuffer 输入缓冲区
     */
    void WritePage(tBlockInDevice block, tPageInBlock page, const Buffer &inBuffer);

    /**
     * @brief 写部分页数据。
     * @param block 块号
     * @param page 页号
     * @param sector 起始扇区
     * @param sectorCount 扇区数
     * @param inBuffer 输入缓冲区
     * @param bufferOffset 输入缓冲区偏移
     */
    void WritePage(const tBlockInDevice &block, const tPageInBlock &page, const tSectorInPage &sector, const tSectorCount &sectorCount,
                   const Buffer &inBuffer, const tSectorOffset &bufferOffset);

    /**
     * @brief 擦除指定块。
     * @param block 块号
     */
    void EraseBlock(tBlockInDevice block);

private:
    std::unique_ptr<NandDeviceDesc> _Desc; ///< 设备参数描述
    std::vector<NandBlock> _Blocks;        ///< 块集合
};

#endif